package mac5789.projeto4.model;

import java.util.Set;

/**
 * Interface que deve ser implementada por um modelo do problema.
 * 
 * @author lundberg
 * 
 */
public interface WorldModel {

	/**
	 * Obtém o conjunto de estados possíveis no mundo
	 * 
	 * @return Set of State
	 */
	Set<State> states();

	/**
	 * Obtém o conjunto de ações possíveis no mundo
	 * 
	 * @return Set of Action
	 */
	Set<Action> actions();

	/**
	 * Obtém o modelo de transição dada uma ação e um estado
	 * 
	 * @param state estado
	 * @param action ação
	 * @return modelo de transição
	 */
	TransitionModel transitionModelFor(State state, Action action);

	/**
	 * Obtém o modelo de recompensas do mundo.
	 * 
	 * @return modelo de recompensas
	 */
	RewardModel rewardModel();

	/**
	 * Obtém o estado inicial do mundo
	 * 
	 * @return estado inicial
	 */
	State initialState();

	/**
	 * Verifica se o estado dado é meta no mundo.
	 * 
	 * @param state estado
	 * @return true caso o estado seja meta, false caso contrário
	 */
	boolean isGoal(State state);

	/**
	 * Obtém as ações disponíveis no estado
	 * 
	 * @param state estado
	 * @return conjunto de ações
	 */
	Set<Action> availableActionsAt(State state);

	/**
	 * Obtém o número máximo de iterações que deve ser executado durante o
	 * cálculo da política.
	 * 
	 * @return int
	 */
	int getMaxIteractions();
}
